package com.prueba.client.datosYlogica.vistas;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import com.prueba.client.datosYlogica.GestorVistas;
import com.prueba.compartido.Seccion;
import com.prueba.compartido.Stakeholder;


public class NivelVista implements Comparable<NivelVista>{
		
		String vista;
		int nivel;
		
		List<Seccion> secciones;
		List<Stakeholder> stakeholders;
		
		public String getNombreVista(){
			return this.vista;
		}
		public int getNivel(){
			return nivel;
		}
		
		public int getCosto(){
			int resultado = 0;
			for(Seccion s : secciones){
				resultado+=s.getCosto();
			}

			return resultado;
		}
		
		public float getBeneficio(){
			float resultado = 0;
			for(Stakeholder s : stakeholders){
				resultado+=Integer.valueOf(s.getCantidad())*Float.valueOf(s.getPrioridad());
			}
			
			return resultado;
		}
		
		public int getCostoPriorizacion(){
			int resultado = 0;
			for(Seccion s : secciones){
				if(!s.getEstado().equals(Seccion.DONE))
					resultado+=s.getCosto();
			}
			
			if(this.nivel>Seccion.INT_OVERVIEW){
				resultado+=GestorVistas.getInstance().getElemento(this.vista).getNivel(nivel-1).getCostoPriorizacion();
			}
			return resultado;
		}
		
		public float getBeneficioPriorizacion(){
			float resultado = 0;
			for(Stakeholder s : stakeholders){
				resultado+=Integer.valueOf(s.getCantidad())*Float.valueOf(s.getPrioridad());
			}
			
			if(this.nivel>Seccion.INT_OVERVIEW){
				resultado+=GestorVistas.getInstance().getElemento(this.vista).getNivel(nivel-1).getBeneficioPriorizacion();
			}
			return resultado;
		}
		
		public float getCostoBeneficio(){
			int costo=getCostoPriorizacion();
			float beneficio=getBeneficioPriorizacion();
			
			if(costo!=0){
				return beneficio/costo;
			}
			return Float.MAX_VALUE;
		}
		
		NivelVista(String vista,int nivel){
			this.vista=vista;
			this.nivel=nivel;
			this.secciones=new LinkedList<Seccion>();
			this.stakeholders=new LinkedList<Stakeholder>();
		}
		
		@Override
		public int compareTo(NivelVista otra) {
			float costobeneficio=getCostoBeneficio();
			float otracostobeneficio=otra.getCostoBeneficio();
			if(costobeneficio<otracostobeneficio)
				return -1;
			else if(costobeneficio>otracostobeneficio)
				return 1;
			else{
				int result=this.vista.compareTo(otra.vista);
				if(result==0){
					if(nivel>otra.nivel)
						return 1;
					else if(nivel<otra.nivel)
						return -1;
					else
						return 0;
				}
				return result;
			}
		}
		
		public void agregarSeccion(Seccion s) {
			this.secciones.add(s);
		}
		public Collection<Seccion> getSecciones() {
			return secciones;
		}
		public void agregarStakeholder(Stakeholder s) {
			this.stakeholders.add(s);
		}
		public void removerStakeholder(Stakeholder s) {
			this.stakeholders.remove(s);
		}
		public Collection<Stakeholder> getStakeholders() {
			return stakeholders;
		}
		
		public boolean isDone() {
			if(this.secciones.isEmpty()){
				return false;
			}
			for(Seccion s: this.secciones)
				if(!s.getEstado().equals(Seccion.DONE)){
					return false;
				}
			return true;
		}
		public void removerStakeholders() {
			stakeholders.clear();
		}
		public void removerSecciones() {
			secciones.clear();
		}

}
